package com.xuesi.demoadmin.utils;

import com.github.pagehelper.PageHelper;
import com.xuesi.demoadmin.utils.page.PageDomain;
import com.xuesi.demoadmin.utils.page.TableSupport;

public class PageUtils extends PageHelper {
    /**
     * 设置请求分页数据
     */
    public static void startPage() throws Exception {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = PageUtils.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }

    /**
     * 检查字符，防止注入绕过
     */
    public static String escapeOrderBySql(String value) throws Exception {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
            throw new Exception("参数不符合规范，不能进行查询");
        }
        // 限制orderBy最大长度
        if (StringUtils.length(value) > 500) {
            throw new Exception("参数已超过最大限制，不能进行查询");
        }
        return value;
    }

    /**
     * 验证 order by 语法是否符合规范
     */
    public static boolean isValidOrderBySql(String value) {
        /**
         * 仅支持字母、数字、下划线、空格、逗号、小数点（支持多个字段排序）
         */
        String matchesStr = "[a-zA-Z0-9_\\ \\,\\.]+";
        return value.matches(matchesStr);
    }
}